home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / tools / drucker / spuler45 / spuler45.txt < prev   
Text File  |  1995-11-25  |  34KB  |  702 lines

  1.  
  2.  
  3.  
  4.                               Spuler v4.5
  5.  
  6.                                   ©by
  7.                              Martin Rogge
  8.                              Möllenholt 24
  9.                               24107 Kiel
  10.  
  11.                              27. Juli 1995
  12.  
  13.  
  14.  
  15.  
  16. Inhaltsverzeichnis
  17. ==================
  18.  
  19. 1) Lieferumfang
  20. 2) Copyright
  21. 3) Beschreibung
  22.   3.1) Wozu das Ganze
  23.   3.2) Funktionsweise des Spoolers
  24.   3.3) Installation
  25.   3.4) Konfiguration
  26.   3.5) Der Normalbetrieb
  27.   3.6) Zusammenarbeit mit GEMINI
  28.   3.7) Zusammenarbeit mit MagiC und MultiTOS
  29.   3.8) Technisches
  30. 4) Bugs oder Features
  31. 5) Was ist neu
  32.   5.1) in Version 4.0
  33.   5.2) in Version 4.1
  34.   5.3) in Version 4.2
  35.   5.4) in Version 4.3
  36.   5.5) in Version 4.4
  37.   5.6) in Version 4.5
  38. 6) Literatur
  39.  
  40.  
  41. 1) Lieferumfang
  42. ===============
  43.  
  44. Das System Spuler v4.5 besteht aus folgenden Dateien:
  45.  
  46. SPULER45.APP Oberfläche mit integriertem Filespuler
  47. SP45_TSR.PRG Hintergrundprogramm
  48. SP45_CFG.PRG Konfigurationsprogramm
  49. SP45_CFG.RSC zugehörige Resource-Datei
  50. SPULER45.IMG Zustandsdiagramm im GEM-Imageformat
  51. SPULER45.DVI Dokumentation als TeX-Datei
  52. SPULER45.TXT Dokumentation im ASCII-Format
  53.  
  54. Die Weitergabe des unvollständigen Systems ist untersagt.
  55.  
  56.  
  57. 2) Copyright
  58. ============
  59.  
  60. Spuler v4.5 ist nicht PD, d.h. ich, Martin Rogge, behalte alle Rechte an
  61. dem Programm. Es ist aber erlaubt und erwünscht, Spuler v4.5 zu benutzen
  62. und komplett mit allen  Dateien  weiterzugeben,  auch  in  komprimierter
  63. Form.  Dabei darf jedoch nur der zur Deckung  aller  Unkosten  benötigte
  64. Geldbetrag gefordert werden.  Falls jemand irgendwo mehr bezahlen mußte,
  65. so möge er oder sie mir bitte schreiben.  Auch Fehlerberichte und Fragen
  66. sind mir willkommen.
  67.  
  68. Postanschrift: Martin Rogge
  69.                Möllenholt 24
  70.                24107 Kiel
  71.  
  72. MausNet:       Martin Rogge @ KI
  73. Internet:      martin_rogge @ ki.maus.de
  74.  
  75. Selbstverständlich geschieht die Benutzung auf eigene Gefahr,  ich über-
  76. nehme keinerlei Haftung für irgendwelche  Datenverluste  oder  sonstwas.
  77. Nach diesen strengen Worten kann ich Dich, lieber Leser, aber beruhigen:
  78. Ich persönlich benutze das Programm seit Jahren (in der jeweils  aktuel-
  79. len Version) und habe bestimmt  schon  Gigabytes  hindurchgepumpt,  ohne
  80. jedes Problem.
  81.  
  82.  
  83. 3) Beschreibung
  84. ===============
  85.  
  86. 3.1) Wozu das Ganze
  87. -------------------
  88.  
  89. Eine der unangenehmsten Eigenschaften des Atari-Betriebssystems ist  die
  90. Tatsache,  daß I/O-Operationen (mit Ausnahme serieller Kanäle) nicht  im
  91. Hintergrund durchgeführt werden,  obwohl die  Hardware  dafür  ausgelegt
  92. ist.  Wer hat nicht schon minutenlang in die Röhre gesehen,  während der
  93. Rechner einen Ordner mit 100 Dateien von Laufwerk A:  nach  Laufwerk  B:
  94. kopiert hat,  obwohl dabei nur eine effektive Prozessorleistung von  ge-
  95. rundet 0% benötigt wird? Indes  ist  bei  Floppy-Operationen  auch  kaum
  96. Abhilfe möglich,  da die einzige Instanz des Betriebssystems,  die (etwa
  97. beim Dateizugriff) begrenzt in die Zukunft blicken könnte,  nämlich  das
  98. DOS,  eine abgeschlossene Einheit bildet. (Seit dem Erscheinen von MagiC
  99. 3 hat sich dieser Sachverhalt allerdings  geändert.)  Außerdem  bräuchte
  100. man zusätzliche Kommunikationsmittel, damit die Direktprogrammierung der
  101. Hardware,  wie sie von fast allen Kopier- und Formatierprogrammen  ange-
  102. wandt wird, nicht zum Absturz führt.
  103.  
  104. Dagegen kann der Datentransfer über  die  Parallelschnittstelle  relativ
  105. einfach in den Hintergrund gedrängt werden.  Das genau ist  die  Aufgabe
  106. von Spuler v4.5.  Eine weitere Aufgabe von Spuler v4.5 ist es,  auf ein-
  107. fache Art und Weise aus GEM-Anwendungen heraus  die  Spulfunktion  über-
  108. wachen und kontrollieren zu können.  Ferner ist  seit  Version  4.4  ein
  109. Filespuler integriert.  Das Hauptaugenmerk dabei liegt darauf,  daß  all
  110. dieses auf möglichst saubere Art und  Weise  geschieht,  also  möglichst
  111. betriebssystemkonform und mit geringstmöglichen Einbußen bei der  allge-
  112. meine Performance.
  113.  
  114. Übrigens ist Spuler v4.5 kein völlig neues Programm,  sondern seit  1988
  115. mehr oder weniger kontinuierlich gewachsen.  Die Version 3.0 ist in  der
  116. c't 6/90 abgedruckt worden.
  117.  
  118. 3.2) Funktionsweise des Spoolers
  119. --------------------------------
  120.  
  121. Bei der Darstellung des Spulprozesses muß man seit Version 4.4  termino-
  122. logisch aufpassen,  da es jetzt zwei verschiedene Mechanismen gibt,  die
  123. in der Umgangssprache beide "Spooler" genannt  werden.  Nennen  wir  den
  124. einen "Interruptspuler" und den  anderen  "Filespuler".  Dabei  ist  der
  125. Interruptspuler der wichtigere der beiden.  Er ist auch  historisch  der
  126. Kern von Spuler v4.5.
  127.  
  128. Der Interruptspuler legt einen ausreichend  großen  Datenpuffer  an  und
  129. biegt alle relevanten BIOS-Ausgabevektoren um.  Soll nun  fürderhin  ein
  130. Zeichen ausgegeben werden, so wandert es in den Puffer. Danach steht der
  131. Pozessor sofort für weitere Aufgaben zur Verfügung. Der Spulprozeß läuft
  132. selbsttätig im Interrupt:  Immer dann,  wenn der Drucker die Busyleitung
  133. zurücksetzt, wird ein Interrupt der Priorität 6 ausgelöst. Dieser Inter-
  134. rupt gibt dann das nächste Zeichen aus. Die Ausgabefrequenz kann man üb-
  135. rigens nicht vorhersehen, sie wird vollständig vom Drucker gesteuert und
  136. ist daher maximal. Sie interessiert aber auch nicht, da der Prozeß ja im
  137. Hintergrund abläuft (einen hinreichend großen Puffer vorausgesetzt).
  138.  
  139. Obige Darstellung ist natürlich etwas vereinfacht,  so müssen  etwa  die
  140. Fälle eines vollen oder leeren Puffers sowie  Eingriffe  des  Steuerpro-
  141. gramms berücksichtigt werden.
  142.  
  143. Was macht nun der Filespuler? Er ist im Steuerprogramm angesiedelt  (das
  144. auch als Accessory benutzt werden kann) und muß explizit angestoßen wer-
  145. den.  Man gibt ihm einen Dateinamen und er versucht dann, diese Datei in
  146. gleichmäßigen Abständen häppchenweise auf den Drucker  auszugeben.  Dazu
  147. sieht er regelmäßig nach,  ob genug Platz im  Puffer  für  ein  weiteres
  148. Häppchen ist.  Dank des Interruptspulers kommen  beim  Drucker  trotzdem
  149. keine Datenhäppchen an,  sonder ein kontinuierlicher Datenstrom, der da-
  150. rüberhinaus auch noch maximale Datenrate hat.
  151.  
  152. 3.3) Installation
  153. -----------------
  154.  
  155. Um normale  Druckerausgaben  im  Hintergrund  durchzuführen,  reicht  es
  156. vollständig, das TSR zu installieren. Am einfachsten kopiert man zu die-
  157. sem Behufe die Datei SP45_TSR.PRG in den  Auto-Ordner.  Für  den  Inter-
  158. ruptspulbetrieb selbst  wird  das  Steuerprogramm  nicht  benötigt.  Das
  159. Steuerprogramm SPULER45.APP erlaubt es einem,  den Füllstand des  Druck-
  160. puffers zu kontrollieren,  den Puffer zu löschen, und Dateien im Hinter-
  161. grund  zu  drucken.   Wenn  man  das  Steuerprogramm   SPULER45.APP   in
  162. SPULER45.ACC umbenennt,  kann man es als gewöhnliches Accessory  betrei-
  163. ben.  Das ist letztlich nur bei einem Singletasking-TOS sinnvoll.  Unter
  164. MagiC und MultiTOS  funktioniert  es  aber  auch.  Der  Hauptunterschied
  165. besteht darin,  daß das Accessory auch bei geschlossenem Fenster weiter-
  166. arbeitet, während die Applikation sich beim Schließen des Fensters been-
  167. det.  (Sollte der Filespuler noch am Werken sein, bleibt die Applikation
  168. allerdings so lange resident, bis die Datei ausgedruckt ist.)
  169.  
  170. 3.4) Konfiguration
  171. ------------------
  172.  
  173. Um das TSR zu konfigurieren,  startet man die  Datei  SP45_CFG.PRG.  Zu-
  174. nächst erfragt das Programm den Namen des TSR mit Hilfe  der  Fileselec-
  175. torbox und testet die angegebene Datei. Als nächstes erscheint eine Dia-
  176. logbox,  in die man die gewünschte Puffergröße eintragen kann.  Man kann
  177. ferner zwei Verzögerungswerte angeben,  deren Funktion ich im  folgenden
  178. Absatz kurz erklären möchte.  Wer mit so technischem Zeugs  nix  am  Hut
  179. hat, kann beim übernächsten Absatz weiterlesen.
  180.  
  181. Es hat sich nämlich gezeigt,  daß der Interruptspuler,  der von mir  auf
  182. höchste Effizienz  getrimmt  wurde,  bei  schnellen  Beschleunigerkarten
  183. Probleme hat. Befindet sich die ganze Routine zum Beispiel im prozessor-
  184. internen Cache eines mit 48 MHz getakteten 68030, erscheinen auf dem Bus
  185. nur noch die Buszugriffe auf die  I/O-Bausteine,  und  zwar  unmittelbar
  186. hintereinander.  Da der Soundchip eine nur schwache Treiberleistung hat,
  187. folgen die Spannungspegel in den Leitungen nicht  schnell  genug  -  vor
  188. allem bei längeren Kabeln.  Deswegen sind jetzt zwei Verzögerungsschlei-
  189. fen eingebaut:  die erste verzögert die Aktivierung des Strobe,  nachdem
  190. die Daten schon angelegt wurden, und die zweite verzögert die Deaktivie-
  191. rung des Strobe.  Im Inneren jeder Verzögerungsschleife findet ein Lese-
  192. zugriff auf den I/O-Bereich statt,  der von keiner  Beschleunigungshard-
  193. ware verkürzt wird.
  194.  
  195. Wenn im Ausdruck falsche Zeichen ankommen,  sollte der erste Wert erhöht
  196. werden.  Werden Zeichen verschluckt,  muß der zweite Wert erhöht werden.
  197. Vermutlich ist es auch sinnvoll,  den zweiten Wert nicht kleiner als den
  198. ersten zu wählen.  In den meisten Fällen wird man die Werte aber einfach
  199. auf 0 stehen lassen können,  das funktioniert bei mir (68030 mit 48 MHz)
  200. problemlos.
  201.  
  202. 3.5) Der Normalbetrieb
  203. ----------------------
  204.  
  205. Aktiviert man das Steuerprogramm,  so öffnet sich ein Fenster,  aus  dem
  206. sich der aktuelle Füllstand des Puffers und seine Größe ergeben. Zu die-
  207. sem Zweck wird ein Balken gezeichnet,  der bei sich änderndem  Füllstand
  208. aktualisiert wird.
  209.  
  210. Hatte man beim  Start  zusätzlich  die  linke  Shifttaste  gedrückt,  so
  211. erscheint stattdessen eine Alertbox,  die fragt,  ob der Puffer gelöscht
  212. werden soll.  Zeitgleich mit dem Erscheinen bewußter Alertbox  ist  auch
  213. die Zeichenausgabe im Interrupt gestoppt worden.  Man kann dann in  Ruhe
  214. entscheiden,  ob man löscht oder weiterdruckt.  Beim Löschen wird  nicht
  215. nur der Puffer des Interruptspulers gelöscht, sondern auch der Filspuler
  216. abgebrochen.  Eine  andere  Möglichkeit,  den  Löschdialog  zu  starten,
  217. besteht darin, bei gedrückter linker Shifttaste in das offene Fenster zu
  218. klicken.
  219.  
  220. Hält man beim Aktivieren des Steuerprogramms oder  Klicken  ins  Fenster
  221. die Controltaste gedrückt,  erscheint statt  alledem  der  Fileselektor.
  222. Jetzt kann man eine Datei auswählen, die vom Filespuler ausgedruckt wer-
  223. den soll.
  224.  
  225. Die Bedienung läßt sich also auf den Merksatz bringen:  "Keine  Taste  -
  226. Fenster, Linke Shifttaste - Löschdialog, Controltaste - Filespuler".
  227.  
  228. 3.6) Zusammenarbeit mit GEMINI
  229. ------------------------------
  230.  
  231. GEMINI benutzt seit Version 1.2 das sogenannte AV-Protokoll zur Kommuni-
  232. kation mit Accessories und Applikationen. Dieses ist auch in Spuler v4.5
  233. implementiert.
  234.  
  235. Für den Anwender heißt das, daß nicht nur SPULER45.APP durch Doppelklick
  236. auf das Dateiicon gestartet werden kann,  sondern  auch  SPULER45.ACC  -
  237. falls das Accessory installiert ist.  Bezüglich der Shift- und der  Con-
  238. troltaste gilt das oben Gesagte. Zieht man ein Dateiicon auf das Spuler-
  239. icon oder das Spulerfenster, wird der Filespuler in Gang gesetzt, um die
  240. Datei auszudrucken.
  241.  
  242. Sämtliche Tastendrücke werden an GEMINI weitergereicht. Die Fensterfunk-
  243. tionen von GEMINI beziehen sich auch  auf  das  Spulerfenster.  Zwischen
  244. einem GEMINI-Fenster  und  dem  Spulerfenster  sollte  kein  Unterschied
  245. feststellbar sein.
  246.  
  247. In früheren Versionen des Spulers wurde stets der Zustand  des  Fensters
  248. in GEMINI.INF abgespeichert,  und auch nach der Rückehr aus einer Appli-
  249. kation wurde der alte Zustand wiederhergestellt.  Dies wird seit Version
  250. 4.5 nicht mehr gemacht.
  251.  
  252. 3.7) Zusammenarbeit mit MagiC und MultiTOS
  253. ------------------------------------------
  254.  
  255. SPULER45.APP prüft stets anhand der Funktion appl_getinfo,  welche  Mög-
  256. lichkeiten das aktuelle  Betriebssystem  bietet  und  sollte  daher  mit
  257. MultiTOS und MagiC zurecht kommen.
  258.  
  259. Zur Zeit besteht die spezielle Anpassung darin, daß
  260.  
  261.  - es als Accessory auf den act_pd-Hack verzichtet
  262.  
  263.  - der Filespuler bei gesperrtem Bildschirm weiterläuft
  264.  
  265.  - es sich bei Empfang von AP_TERM beendet.
  266.  
  267. Für spätere Versionen  ist  evtl.  die  Implementierung  der  Protokolle
  268. DRAG&DROP und ICONIFY geplant.
  269.  
  270. Als Druckprogramm unter MAGXDESK ist SPULER45.APP übrigens  jetzt  schon
  271. hervorragend geeignet, da MAGXDESK das AV-Protokoll verwendet.
  272.  
  273. 3.8) Technisches
  274. ----------------
  275.  
  276. Auf einer gewissen Abstraktionsebene ist  Spuler  v4.5  (wie  eigentlich
  277. alle eventorientierten Programme) einfach beschreibbar (ohne  das  jetzt
  278. näher zu definieren) durch einen endlichen Automaten.
  279.  
  280. So etwas ähnliches (nennen wir  es  Zustandsdiagramm)  stellt  Abbildung
  281. SPULER45.IMG dar.  Ein Bild sagt halt doch mehr als tausend  Worte.  Wie
  282. aus der Abbildung ersichtlich ist,  besteht Spuler v4.5 im  wesentlichen
  283. aus zwei zentralen Zuständen,  die  im  Programmcode  tatsächlich  durch
  284. Eventschleifen repräsentiert sind.  Die kleinere von beiden  wartet  ei-
  285. gentlich nur auf die Aktivierung des Fensters.  Daher frißt Spuler  v4.5
  286. praktisch keine AES-Zeit,  wenn das Fenster zu ist. Die größere Schleife
  287. schaut alle 0.2s nach,  ob der Füllstand des Puffers sich verändert hat.
  288. Dank eines effizienten Bindings für evnt_multi()  wird  aber  auch  dort
  289. keine Rechenzeit verdorben.
  290.  
  291. Etwas anders sieht das Bild aus,  wenn der Filespuler aktiv ist.  Dieser
  292. liest im Timerevent gegebenenfalls 4KB von Platte ein  und  schiebt  sie
  293. gleich in den Puffer des Interruptspulers.  Ursprünglich wollte ich  die
  294. Daten über das BIOS ausgeben,  um so eventuelle Systemerweiterungen  des
  295. Users (Filter usw.) nicht zu umgehen. Bei einem schnellen 68030 geht das
  296. durchaus noch,  aber ein 68000 mit 8 MHz wird durch einige tausend BIOS-
  297. Calls pro Sekunde fast bis zum Stillstand gebremst. Damit der Filespuler
  298. nicht direkt in den Puffer des Interruptspulers schreiben muß,  habe ich
  299. die Softwareschnittstelle des TSR um eine  weitere  Funktion  bereichert
  300. (s.u.).  Insgesamt ist der Filespuler dadurch so schnell  geworden,  daß
  301. auch auf einem ST mit 8 MHz keine störende Verlangsamung  beim  Arbeiten
  302. feststellbar ist.  Trotzdem wird die Datei verzugslos und mit  maximaler
  303. Druckergeschwindigkeit ausgedruckt.
  304.  
  305.  
  306. 4) Bugs oder Features
  307. =====================
  308.  
  309.  - Der Interruptspuler bedient sich der xcon-Vektoren  des  BIOS.  Diese
  310.    gibt es jedoch erst seit TOS 1.02,  dem Blitter-TOS. Die Alternative,
  311.    den Trap umzubiegen,  halte ich für eine Zumutung. Wer heute noch TOS
  312.    1.0 benutzt,  wird vermutlich für ein  Betriebssystemkonzept  wie  I/
  313.    O-Transfer im Hintergrund ohnehin nichts übrig haben.
  314.  
  315.  - Ist der Drucker ausgeschaltet oder offline,  so können beim  normalen
  316.    Ausdrucken folgende zwei Fälle auftreten.  Falls die Druckdaten weni-
  317.    ger als die Pufferlänge sind,  so wandern sie vollständig in den Puf-
  318.    fer.  Sobald man den Drucker online schaltet, wird alles ausgedruckt.
  319.    Sind es dagegen mehr Daten,  als in den Puffer passen,  so wird  erst
  320.    einmal der Puffer gefüllt. Bei den folgenden Zeichen verhält sich die
  321.    Ausgaberoutine dann wie die originale BIOS-Routine. Erst wird 10s ge-
  322.    wartet, danach ein Fehlerflag gesetzt und alle nachfolgenden Zeichen-
  323.    ausgaben mit Fehler abgebrochen.  (Erst eine fünfsekündige Druckpause
  324.    macht das Flag wieder unwirksam).  Der Puffer  wird  aber  nicht  ge-
  325.    löscht, das bleibt dem Anwender überlassen.
  326.  
  327.  - Da mir keine Möglichkeit bekannt ist, an die Druckerkonfiguration des
  328.    XBIOS heranzukommen (ein Trap bei jeder Zeichenausgabe ist indiskuta-
  329.    bel),  wird ein serieller Drucker nicht mehr unterstützt. Das ist bei
  330.    meinem TeX-Druckertreiber allerdings ein Feature:  Durch Ausgabe  auf
  331.    einen seriellen Drucker zwinge ich ihn,  das BIOS  überhaupt  zu  be-
  332.    nutzen.  Sonst gibt er alles direkt auf den Port, wohl in der Einbil-
  333.    dung,  beim Warten auf den Drucker weniger Zeit zu verschwenden. (Ein
  334.    ähnlich kläglicher Versuch war auch 'mal in c't 10/91, natürlich ohne
  335.    jeden Benchmark.)
  336.  
  337.  - Aus naheliegenden Gründen sollte der Puffer leer sein,  bevor man ein
  338.    Programm startet, das den Port direkt programmiert.
  339.  
  340.  - Es werden auch die Vektoren von Bconstat() und Bconin() für den Druk-
  341.    ker umgebogen:  Sie geben stets "Kein Zeichen verfügbar" bzw.  CTRL-Z
  342.    zurück.  Damit ist jetzt auch bei TOS 1.02  die  GEMDOS-I/O-Umlenkung
  343.    auf den Drucker möglich.
  344.  
  345.  - Wünschenswert wäre natürlich eine dynamische Speicheranforderung  zur
  346.    Laufzeit,  d.h.  daß Pufferspeicher in kleinen Stücken genau dann vom
  347.    Betriebssystem angefordert wird,  wenn er  gebraucht  wird  und  auch
  348.    stückweise zurückgegeben wird.  Das ist jedoch mit  den  Mitteln  des
  349.    GEMDOS für speicherresidente Programme nicht machbar.  An eine Lösung
  350.    mit Hilfe der AES (durch Auswertung von AC_CLOSE) will ich nicht ein-
  351.    mal denken,  da der Spulprozeß selbst _unabhängig_ vom GEM sein soll,
  352.    TOS-Programme dann Schwierigkeiten bereiten und es  außerdem  mangels
  353.    Handshake Timingprobleme mit den AES-Messages gibt.  Ein sicherer Be-
  354.    trieb wäre Zufall.
  355.  
  356.  - Noch lieber hätte ich einen Mechanismus,  der Teile des  Puffers  auf
  357.    die Platte auslagert und bei Bedarf wieder lädt.  Wollte man dazu das
  358.    normale Filesystem benutzen,  müßten GEMDOS-Aufrufe aus dem Interrupt
  359.    heraus gemacht werden,  was Atari sei Dank unmöglich ist.  Auch einen
  360.    pollenden AES-Prozeß zu benutzen,  ist  keine  gute  Idee:  ein  TOS-
  361.    -Programm oder ein schlecht programmiertes GEM-Programm könnte  einen
  362.    Deadlock erzeugen. Fazit: mit den Mitteln des Betriebssystems ist das
  363.    ganze nicht sauber machbar.
  364.  
  365.    Mir ist zwar bekannt,  daß es Spooler gibt,  die BIOS-Traps  abfangen
  366.    und die Druckdaten mit einem Trick in eine Datei schreiben,  aber  so
  367.    etwas ist in meinen  Augen  ein  Hack  und  entspricht  nicht  meiner
  368.    Vorstellung von sauberem Programmieren.
  369.  
  370.  - Was ich noch machen wollte,  ist ein CPX zur Spulersteuerung.  Aller-
  371.    dings wäre damit vermutlich kein Filespuler möglich.  Falls sich aber
  372.    jemand daran macht (die Softwareschnittstelle des TSR ist ja dokumen-
  373.    tiert), bitte ich um Nachricht.
  374.  
  375.  - Wo wir gerade bei der Softwareschnittstelle sind:  Das Konzept,  über
  376.    einen Cookiepointer aus dem Speicher eines anderen Prozesses zu lesen
  377.    bzw.  dessen Code auszuführen,  läuft natürlich der Memory Protection
  378.    von MiNT zuwider.  Hier hilft nur, den Speicher des TSR als global zu
  379.    kennzeichnen, oder aber das Steuerprogramm nicht zu benutzen.
  380.  
  381.  - Während der Filespuler läuft, wird die Bconout-Schnittstelle _ nicht_
  382.    gesperrt.  Ich erlaube es einfach einem AES-Prozeß nicht, in das BIOS
  383.    einzugreifen, denn das BIOS soll nach wie vor transparent und autonom
  384.    funktionieren.  Das Konzept des Lockings von Systemressourcen gibt es
  385.    halt beim TOS nicht.
  386.  
  387.    Es liegt in der Verantwortung des Benutzers,  nur  einen  Prozeß  zur
  388.    Zeit drucken zu lassen. Das Schlimmste, was andernfalls passiert, ist
  389.    die Vermischung der verschiedenen Druckdaten.
  390.  
  391.  - Auch zum ewigen Thema GEMDOS ist etwas zu sagen:  Es  scheint  so  zu
  392.    sein,  daß die Filehandles des GEMDOS für den Rechner global sind, es
  393.    also keine Benutzerfiledeskriptorentabelle (für jeden  Prozeß)  gibt.
  394.    Jeder Prozeß kann auf jedes Handle zugreifen,  wenn er es nur  kennt.
  395.    Trotzdem wird der Prozeß vermerkt,  der die Datei geöffnet hat, damit
  396.    bei dessen Ende die Datei automatisch geschlossen wird.  Da  nun  ein
  397.    Accessory im SingleTOS stets unter dem aktuellen GEMDOS-Prozeß läuft,
  398.    gibt es Probleme,  wenn eine Datei über einen AES-Aufruf hinweg offen
  399.    bleiben soll --  der  beim  Öffnen  aktive  GEMDOS-Prozeß  könnte  ja
  400.    zwischenzeitlich zuende sein und das Filehandle weg oder gar neu ver-
  401.    geben.  Zur Lösung dieses Problems könnte man jeden  Dateizugriff  in
  402.    Fopen/Fclose schachteln,  was aber ineffizient  ist.  Ich  habe  mich
  403.    daher schweren  Herzens  entschlossen,  (im  Falle  von  Accessory  &
  404.    SingleTOS) den bekannten aber unschönen Hack zu benutzen,  dem GEMDOS
  405.    beim Öffnen des zu spulenden Files einen  anderen  Prozeß  (eben  den
  406.    Spuler) vorzuspiegeln.  Lesen und  Schließen  geschieht  dann  wieder
  407.    unter dem gerade aktuellen Prozeß.
  408.  
  409.  - Ich sollte noch ein paar Worte zur Konzeption des Filespulers verlie-
  410.    ren.  Es war _nicht_ geplant,  den Filespuler  als  zentralen  Druck-
  411.    manager oder als Druckerdämon zu entwerfen.  Ein solches Konzept wäre
  412.    zum einen dem TOS etwas fremd, zum anderen wäre es ein extrem aufwen-
  413.    diges Projekt, das die Kontrolle über den gesamten Druckbetrieb über-
  414.    nehmen müßte und vielfältige Konfigurationsmöglichkeiten bräuchte  --
  415.    man denke  an  Druckerinitialisiserung,  Formfeed,  Fehlerbehandlung,
  416.    usw.
  417.  
  418.    sollte dagegen schon immer ein kleines und effizientes  System  sein.
  419.    In Version 4.5 belegen TSR und APP im Speicher (!)  17  KB  zuzüglich
  420.    Puffer.  Unter MagiC reichen 8 KB Puffer völlig  aus.  Auch  die  Be-
  421.    lastung für das Restsystem ist minimal:  Es werden keine Traps  abge-
  422.    fangen, das TSR ist optimal in Assembler codiert und über die geringe
  423.    AES-Belastung ist weiter  oben  schon  geschrieben  worden.  Trotzdem
  424.    könnte Spuler v4.5 von,  sagen wir,  einem Dämon benutzt werden,  der
  425.    dem Steuerprogramm VA_START-Messages schickt.
  426.  
  427.    Kleinere Druckjobs sollten  nach  Möglichkeit  wie  gewöhnlich  abge-
  428.    wickelt werden.  Der Interruptspuler sorgt schon für das Verschwinden
  429.    eventueller Denkpausen. Erst bei größeren Jobs wird die Benutzung des
  430.    Filespulers sinnvoll,  wenn man gleichzeitig  auf  dem  Rechner  noch
  431.    etwas anderes zu tun hat.  Unter SingleTOS muß es sich dabei aber  um
  432.    GEM-Applikationen handeln,  da sonst der  Filespuler  nicht  parallel
  433.    dazu arbeiten kann.  Während ich zum Beispiel  diesen  Text  hier  in
  434.    einem GEM-Editor tippe,  druckt die Nadelsäge neben mir ein über 200-
  435.    seitiges Postscriptdokument aus.
  436.  
  437.    Um den Filespuler überhaupt benutzen zu können, müssen die Druckdaten
  438.    als Datei vorliegen.  Dazu muß man das druckende Programm so einstel-
  439.    len,  daß es in eine Datei druckt. Geht das nicht, so kann man es mit
  440.    der Ausgabeumlenkung des GEMDOS versuchen.  Programme, die stets über
  441.    BIOS oder - schlimmer - durch Direktprogrammierung der Hardware druk-
  442.    ken,  können den Filespuler nicht  nutzen.  Glücklicherweise  gehören
  443.    Ghostscript und die meisten DVI-Treiber nicht in diese Kategorie.
  444.  
  445.    Eine A4-Seite verschlingt bei 360*360 dpi übrigens bis zu einem Mega-
  446.    byte auf der Platte.  Man braucht für das Filespulen  von  Vollgrafik
  447.    also gehörige Reserven.
  448.  
  449.  - Unter MagiC wird bei der BIOS-Ausgabe und vollem  Puffer  immer  noch
  450.    eine Warteschleife (bis zum Timeout) durchlaufen.  Bis ich  die  Pro-
  451.    grammierdoku verstehe, bleibt das auch erst mal so.
  452.  
  453.  
  454. 5) Was ist neu
  455. ==============
  456.  
  457. 5.1) in Version 4.0
  458. -------------------
  459.  
  460.  - Fast der gesamter Code ist neu.  Lediglich die Interrupt-  und  BIOS-
  461.    Routinen sind (leicht überarbeitet) von Version 3 erhalten geblieben.
  462.    Die gesamte Accessoryverwaltung ist nun in C geschrieben.
  463.  
  464.  - Der Timeout wurde von 30s auf 10s verkürzt.
  465.  
  466.  - Die BIOS-Vektoren 0x506 und 0x50A für die Zeichenausgabe der internen
  467.    Hardcopyroutine werden nun umgebogen.
  468.  
  469.  - Die Vektorverbiegung entspricht jetzt dem  XBRA-Standard.  Die  XBRA-
  470.    Kennung von Spuler v4.0 ist "spMR".
  471.  
  472.  - Der Füllstand wird jetzt  intuitiv  erfaßbar  als  Balkengrafik  dar-
  473.    gestellt. Außerdem läuft die Anzeige auch während der Ausgabe.
  474.  
  475.  - Das AV-Protokoll wurde implementiert.
  476.  
  477.  - Bei Start als Hauptapplikation konfiguriert sich Spuler v4.0 selbst.
  478.  
  479. 5.2) in Version 4.1
  480. -------------------
  481.  
  482.  - Leider mußte ich nach der Freigabe von Spuler v4.0 noch einen  ärger-
  483.    lichen Fehler feststellen: In der Schleife zur Bearbeitung der Recht-
  484.    ecklisten wurden die falschen  Variablen  getestet,  so  daß  zuviele
  485.    wind_get(WF_NEXTXYWH,  ...) getätigt wurden.  Der Fehler fällt  nicht
  486.    auf,  weil nach endlich vielen Schritten die AES immer so frei  sind,
  487.    als x-Koordinate eine 0 zu liefern,  zumindest bei meinem Rechner. Da
  488.    jedoch TOS das erste nichtdeterministische Betriebssystem  ist,  kann
  489.    man sich wohl kaum darauf verlassen.
  490.  
  491.  - Die Fensterkoordinaten werden nun als Relativgrößen gespeichert.
  492.  
  493. 5.3) in Version 4.2
  494. -------------------
  495.  
  496.  - Der Spuler ist jetzt zweigeteilt in ein TSR und  ein  Accessory.  Die
  497.    Kommunikation geschieht über den cookie jar.  Dazu legt das  TSR  ein
  498.    cookie mit Namen "spMR" an.  Der zugehörige Parameter ist ein Pointer
  499.    auf folgende Struktur (in C-Syntax):
  500.  
  501.      struct
  502.      {   long length;            /* Pufferlänge */
  503.          long lobuf;             /* Startadresse des Puffers */
  504.          long hibuf;             /* Endadresse des Puffers */
  505.          long inmark;            /* Eingabepointer */
  506.          long outmark;           /* Ausgabepointer */
  507.          void (*stop)();         /* Stoppt Hintergrundprozeß */
  508.          void (*restart)();      /* Neustart desselben */
  509.      }
  510.  
  511.    Diese (hiermit dokumentierte) Struktur ist nur gültig, wenn length!=0
  512.    ist.  Dadurch bleibt die Definition offen für zukünftige  Entwicklun-
  513.    gen. Der Puffer ist genau dann leer, wenn inmark==outmark ist. Allge-
  514.    mein liefert das Programmstück
  515.  
  516.      l=inmark-outmark;
  517.      if (l<0) l+=length;
  518.  
  519.    den aktuellen Füllstand des Puffers in der Variablen l.  Die  übrigen
  520.    Einträge der Struktur tun genau das,  was man anhand  der  Kommentar-
  521.    zeile von ihnen erwarten würde. Jede andere Eigenschaft des TSR gelte
  522.    als undokumentiert.
  523.  
  524.  - Der Non-Autovektor-Interrupt-Pointer des MFP für das  Busy-Signal  an
  525.    0x100 wird nun einfach überschrieben und nicht mehr  in  einer  XBRA-
  526.    Struktur vor der neuen Interruptroutine gerettet. Das war nötig, weil
  527.    das TOS diesen Pointer bei einem Reset nicht zurücksetzt und dann ein
  528.    Zykel in der XBRA-Kette entsteht (bei gleicher  Systemkonfiguration).
  529.    Das hinwiederum sägt einige der vektorüberwachenden Programme ab.
  530.  
  531.  - Der Busy-Interrupt wird nun stets initialisiert, wenn ein Byte in den
  532.    leeren Puffer übertragen wird.  Das war nötig,  da z.B.  einige  TeX-
  533.    Druckertreiber einen eigenen Spuler einrichten. Das ist an sich nicht
  534.    schlimm,  nur ist nach dem Ende dieser Programme  der  Busy-Interrupt
  535.    disabled und der Interruptvektor überschrieben.
  536.  
  537.  - Die Messages des AV-Protokolls werden nun nicht mehr einfach an ap_id
  538.    0 geschickt. Stattdessen wird bei jeder Einstellung des Minimalproto-
  539.    kolls versucht, die Applikationen AVSERVER oder GEMINI zu finden. Nur
  540.    wenn das fehlschlägt, wird weiterhin ap_id 0 verwendet.
  541.  
  542. 5.4) in Version 4.3
  543. -------------------
  544.  
  545.  - Im wesentlichen wurde nur das TSR überarbeitet. Ich wollte eigentlich
  546.    nur testen,  ob ein Burst-Fill in der Interruptroutine sinnvoll  ist.
  547.    Zumindest für meinen NEC P6 ist es das aber nicht. Stattdessen gelang
  548.    es mir,  die Interruptbehandlung um über 10 Mikrosekunden (bei  einem
  549.    Standard-ST) zu verkürzen.
  550.  
  551.  - Es wird jetzt bei jedem Bconout geprüft,  ob der  MFP-Interrupt  noch
  552.    korrekt initialisiert ist.  Falls nicht,  wird kurzerhand  alles  neu
  553.    initialisiert. In Version 4.2 geschah das nur bei leerem Puffer.
  554.  
  555.  - Das TSR gibt jetzt eine Einschaltmeldung aus.
  556.  
  557.  - Das ACC kann jetzt im Zeitalter des Multitasking auch als PRG gestar-
  558.    tet werden.
  559.  
  560.  - Dafür ist jetzt ein eigenständiges Konfigurationsprogramm beigelegt.
  561.  
  562. 5.5) in Version 4.4
  563. -------------------
  564.  
  565. Es hat eine mehr oder weniger drastische Überarbeitung  aller  Programm-
  566. teile gegeben.
  567.  
  568.  - Beim TSR von Version 4.3 hatte ich schlauerweise ein bset  mit  einem
  569.    bclr verwechselt.  Das führte dazu,  daß die stop-Routine ihrem Namen
  570.    nicht gerecht wurde.
  571.  
  572.  - In die Ausgaberoutine wurden  zwei  Verzögerungsschleifen  eingebaut,
  573.    die mit dem Konfigurationsprogramm konfiguriert  werden  können.  Die
  574.    Funktion dieser Schleifen wurde oben schon beschrieben. Damit sollten
  575.    jetzt alle Probleme mit schnellen Beschleunigerkarten der  Vergangen-
  576.    heit angehören.
  577.  
  578.  - Es ist eine weitere aufrufbare Funktion implementiert worden. Sie hat
  579.    (in C-Notation) den Prototypen
  580.  
  581.      long write(long count, char *buffer)
  582.  
  583.    und funktioniert ähnlich wie Fwrite:  Es wird  versucht  count  viele
  584.    Zeichen von buffer an in den Puffer des Interruptspulers zu  übertra-
  585.    gen.  Zurückgegeben wird  die  Anzahl  der  tatsächlich  übertragenen
  586.    Zeichen. Das können durchaus weniger als count sein, wenn nicht genug
  587.    Platz im Puffer ist.  Auf keinen Fall wartet write auf das Freiwerden
  588.    von Platz.  Wie bei Bconout wird geprüft, ob der Spulerinterrupt noch
  589.    korrekt initialisiert ist,  und der Spulprozeß wird nötigenfalls  an-
  590.    gestoßen.
  591.  
  592.    Die Parameterübergabe erfolgt gemäß der Pure-C-Konvention:  count  in
  593.    D0, buffer in A0, Rückgabewert in D0.
  594.  
  595.  - Um auf die neuen Elemente zugreifen zu können,  wurde  die  Software-
  596.    schnittstelle erweitert. Der Parameter im Cookie "spMR" zeigt nun auf
  597.    folgende Struktur (int habe 16 bit):
  598.  
  599.      struct
  600.      {   long length;                 /* Pufferlänge */
  601.          long lobuf;                  /* Startadresse des Puffers */
  602.          long hibuf;                  /* Endadresse des Puffers */
  603.          long inmark;                 /* Eingabepointer */
  604.          long outmark;                /* Ausgabepointer */
  605.          void (*stop)(void);          /* Stoppt Hintergrundprozeß */
  606.          void (*restart)(void);       /* Neustart desselben */
  607.          long (*write)(long, char*);  /* Schreibt in den Puffer */
  608.          int  delay1;                 /* Verzögerung vor Strobe */
  609.          int  delay2;                 /* Verzögerung nach Strobe */
  610.      }
  611.  
  612.    Offenbar ist diese Struktur aufwärtskompatibel zu der alten.  Für die
  613.    ersten sieben Einträge gilt das unter Version 4.2 Gesagte.
  614.  
  615.  - Das Konfigurationsprogramm hat nun eine externe  RSC-Datei,  was  die
  616.    Wartung wesentlich vereinfacht.  Das ist von der Handhabung her  kein
  617.    Nachteil, denn schließlich wird das Konfigurationsprogramm nur selten
  618.    benutzt.
  619.  
  620.  - Bevor das Konfigurationsprogramm seinen Dialog öffnet,  fragt es  be-
  621.    reits nach dem TSR,  um die aktuellen Werte in die Dialogbox zu über-
  622.    nehmen.
  623.  
  624.  - Die herausragende Neuerung im ACC bzw.  PRG ist der  Filespuler.  Die
  625.    gesamte Dokumentation wurde entsprechend umgearbeitet, so daß an die-
  626.    ser Stelle nichts mehr zu sagen bleibt.
  627.  
  628. 5.6) in Version 4.5
  629. -------------------
  630.  
  631. Spuler v4.5 wurde im wesentlichen nur an MagiC (und damit  an  MultiTOS)
  632. angepaßt:
  633.  
  634.  - Die Distribution enthält jetzt das APP anstelle des  ACC,  was  unter
  635.    MagiC sinnvoller ist. Das ist halt die neue Konfiguration des Autors.
  636.    Am besten trägt man das Steuerprogramm bei Magxdesk  unter  Optionen-
  637.    Programme ein.
  638.  
  639.  - Unter MagiC (oder  MultiTOS)  wird  der  Filespuler  nicht  mehr  von
  640.    wind_update blockiert.  Das hat den sehr angenehmen Seiteneffekt, daß
  641.    man für das Filespulen den Puffer des  TSRs  nun  sehr  klein  wählen
  642.    kann. Bereits 8 KB reichen völlig aus, den Drucker immer mit Stoff zu
  643.    versorgen. Für die BIOS-Schnittstelle braucht man allerdings wie bis-
  644.    her einen großen Puffer.
  645.  
  646.  - Auch als Accessory verzichtet der Filespuler auf den  oben  erwähnten
  647.    act_pd-Hack, wenn MagiC (oder MultiTOS) aktiv ist.
  648.  
  649.  - Das Steuerprogramm wurde um diejenigen Funktionen  des  AV-Protokolls
  650.    erleichtert, die Gemini stets über die Lage des Fensters auf dem Lau-
  651.    fenden halten.  Das ist letztlich eine Spielerei,  die 1.3  Kilobytes
  652.    kostet.  Das sei nicht viel? Nun, es drückt die Dateilänge unter 8192
  653.    und spart unter Umständen einen großen Plattensektor.  ;-) Durch  ein
  654.    einfaches Compilerflag kann der Support aber jederzeit wieder eincom-
  655.    piliert werden.
  656.  
  657.  - Das Steuerprogramm prüft jetzt zyklisch nach,  ob  der  MFP-Interrupt
  658.    noch korrekt initialisiert ist. In einer Multitasking-Umgebung ist es
  659.    einfach zu wahrscheinlich,  einmal auf ein Programm  zu  stoßen,  das
  660.    selber spulen möchte.  (Im Löschdialog (Button "zurück")  konnte  man
  661.    den Interrupt schon immer manuell neu Installieren.) Dazu  wurde  die
  662.    Softwareschnittstelle des TSRs um einen neuen Eintrag erweitert:
  663.  
  664.      struct
  665.      {   long length;                 /* Pufferlänge */
  666.          long lobuf;                  /* Startadresse des Puffers */
  667.          long hibuf;                  /* Endadresse des Puffers */
  668.          long inmark;                 /* Eingabepointer */
  669.          long outmark;                /* Ausgabepointer */
  670.          void (*stop)(void);          /* Stoppt Hintergrundprozeß */
  671.          void (*restart)(void);       /* Neustart desselben */
  672.          long (*write)(long, char*);  /* Schreibt in den Puffer */
  673.          int  delay1;                 /* Verzögerung vor Strobe */
  674.          int  delay2;                 /* Verzögerung nach Strobe */
  675.          void (*check)(void);         /* Test und evtl. Neustart */
  676.      }
  677.  
  678.  - Die Blocklänge des Filespulers wurde auf 4096 erhöht,  was beim Autor
  679.    gerade einem Plattensektor entspricht und dadurch unter Umständen die
  680.    Performance erhöht.  Zum  Ausgleich  wurden  die  Zeitintervalle  für
  681.    evnt_timer auf 200 ms verlängert.
  682.  
  683.    Man kann als Programmierer :-) mit diesen Parametern in weiten  Gren-
  684.    zen spielen.  Es sollten nur die Daten mit einer höheren Rate in  den
  685.    Puffer hineinkommen als der Drucker  sie  herausholt.  Auf  langsamen
  686.    Rechnern sollten die evnt_timer-Intervalle nicht zu kurz sein,  damit
  687.    die Gesamtperformance nicht leidet. Umgekehrt sind zu große Blocklän-
  688.    gen unter Singletaskingsystemen zu vermeiden,  da der Rechner während
  689.    der Plattenzugriffe blockiert ist.  Das gilt übrigens auch für Multi-
  690.    TOS. Unter MagiC mit Hintergrund-DMA ist es dagegen völlig egal. Hier
  691.    sind große Blöcke sogar vorzuziehen,  da DMA immer billiger  ist  als
  692.    Taskswitching.
  693.  
  694.  
  695. 6) Literatur
  696. ============
  697.  
  698. [1] Jankowski, Rabich, Reschke: ATARI ST Profibuch, Sybex, 1988
  699. [2] Amler, Zobel: Einer für alles, c't 9/88, Seite 144
  700. [3] Rogge: Von der Spule, c't 6/90, Seite 212
  701.  
  702.